struct Node {
    char* key;
    char* value;
    Node* pNext;
};

struct Hashtable {
    /*real node storage, indexed by hash */
    Node** bucket;
    /* size of bucket storage */
    int size;
    /* real node count */
    int node_count;
    /* expand thresold. When node_count*expand_thresold>size,
       hashtable grows */
    float expand_thresold;
    /* shrink thresold. When node_count*shrink_thresold<size,
       hashtable shrinks  */ 
    float shrink_thresold;
};

Hashtable* create_hashtable(int size);

Hashtable* create_hashtable(int size, float expand_thresold, float shrink_thresold);

void delete_hashtable(Hashtable* hashtable);

void hashtable_add(Hashtable* hashtable, char* key, char* value);

char* hashtable_find(Hashtable* hashtable, char* key);

void hashtable_delete(Hashtable* hashtable, char* key);
